package com.anttribe.components.infra.io;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 文件处理辅助类
 *
 * @author zhaoyong
 * @date 2021年4月20日
 */
public final class FileUtils {

    /**
     * 文件路径校验正则
     */
    private static final String FILE_PATH_REGEX = "^(([a-zA-Z]:)|/)(/w+/)*(/w+)$";

    /**
     * 校验文件路径是否合法
     *
     * @param filepath
     * @return boolean
     */
    public static boolean verifyFilePath(String filepath) {
        if (StringUtils.isEmpty(filepath)) {
            return Boolean.FALSE;
        }

        // 文件路径处理
        filepath = filepath.replace("\\", "/").replace("../", "").replace("./", "");
        if (StringUtils.isEmpty(filepath)) {
            return Boolean.FALSE;
        }

        // 文件路径正则匹配
        Pattern filePathPattern = Pattern.compile(FILE_PATH_REGEX);
        Matcher m = filePathPattern.matcher(filepath);
        return m.matches();
    }

    /**
     * 创建文件目录
     *
     * @param filepath
     * @return boolean 结果
     */
    public static boolean mkdir(String filepath) {
        if (StringUtils.isEmpty(filepath)) {
            return Boolean.FALSE;
        }

        File dirFile = new File(filepath);
        return mkdir(dirFile);
    }

    /**
     * 创建文件目录
     *
     * @param dirFile
     *            目录文件
     * @return boolean 结果
     */
    public static boolean mkdir(File dirFile) {
        if (null == dirFile) {
            return Boolean.FALSE;
        }

        boolean mkdirs = Boolean.TRUE;
        if (!dirFile.exists()) {
            // 创建多级文件目录
            mkdirs = dirFile.mkdirs();
        }
        return mkdirs;
    }

    /**
     * 关闭资源
     *
     * @param quietly
     * @throws IOException
     */
    public static void closeQuietly(Closeable quietly) throws IOException {
        if (null != quietly) {
            quietly.close();
        }
    }

    /**
     * 删除文件
     * 
     * @param file
     *            File
     */
    public static void deleteQuietly(File file) {
        if (null != file) {
            file.delete();
        }
    }

}
